/***********************************************************************************
 * 文件名： polsys_config.h
 * 版本： 7
 * 说明：
 * 		polsys 的配置文件。此文件可以当作通用头文件，可以在这里添加一些顶级宏定义。
 * 修改记录：
 * 	2021/04/28: 初版。 刘言。
 *  2021/05/19: 兼容polsys和polsys_lite
 *  2021/05/20: 
 *      去掉SYSTICK定时周期设置，由用户调用Polsys_Tick的周期决定，建议为1ms，否则某些组件可
 *  能会运行出错。刘言。
 *  2021/11/15: 
 * 		定义 _POLSYS_DEBUG 后可以查看CPU使用率、是否过载等调试信息，每个TICK周期更新，过载
 * 	表示在一个TICK周期内不能执行完所有任务，一旦置位复位才能清除。
 * 		增加 _POLSYS_DEBUG 需要的API配置项。
 *      增加 POLSYS_TICK_CYCLE 配置项，此配置项不会影响实际TICK周期，用户如实配置其调用 
 *  Polsys_Tick 的周期，作用是留给需要的组件引用。
 *  2022/11/28:
 *      POLSYS_TICK_CYCLE 不会影响组件，仅提供给polsys引用，对外api时间单位统一为ms。
 *      增加 POLSYS_USE_PRIO 配置项，详见下文。
 *  2023/3/15:
 *      增加 POLSYS_ENV_TYPE ，配合 polsys_port.c 便于快速移植。
 *  2023/12/22:
 *      增加 POLSYS_USE_PARAM，任务入口可以携带一个参数。
***********************************************************************************/
#ifndef _POLSYS_CONFIG_H_
#define _POLSYS_CONFIG_H_

// 驱动和组件接口不用再包含头文件
#include "board.h"



// #ifdef DEBUG
// 定义表示启用DEBUG功能，可以获得更多系统信息，LITE暂不支持
// 使用RTOS时，CPU占用率计算将不准确，因为其统计的是polsys任务执行开始到结束的时间段，其中可能包含了被其他线程打断的时间，包括空闲线程（Polsys任务主动阻塞当前线程）。
#define _POLSYS_DEBUG
// #endif

// 定义表明使用的是 POLSYS_LITE ，开发组件或驱动的开发者可以利用这个宏定义让组件或驱动兼容不同的运行环境。
// 不定义表示使用的是标准POLSYS
// #define POLSYS_LITE

// TICK周期，单位ms. 可能不会影响实际TICK周期，用户需如实配置其调用 Polsys_Tick 函数的周期。建议设置为1~10ms，不建议超过10ms。
#define POLSYS_TICK_CYCLE   10

// 定义MCU型号，这将会决定使用的MCU驱动包
#define POLSYS_MCU_MODEL BSP_MCU_MODEL

#ifdef POLSYS_LITE
// 在这里添加需要循环一直执行的任务
#define _POLSYS_TASK_GROUP_LOOP \
    {                           \
        Wdt_Clear();            \
    }
// 在这里添加需要间隔 1 tick 执行的任务
#define _POLSYS_TASK_GROUP_1TICK \
    {                            \
        SLEDC_CtrlLoop();        \
        RHC_Task();              \
        TouchKey_Scan();         \
        SWSD_Loop();             \
    }
// 在这里添加需要间隔 10 tick 执行的任务，如果没有任务，注释掉define可以节省资源
#define _POLSYS_TASK_GROUP_10TICK \
    {                             \
        App_Timer();              \
        BMLite_Loop();            \
    }
// 在这里添加需要间隔100tick执行的任务，如果没有任务，注释掉define可以节省资源
#define _POLSYS_TASK_GROUP_100TICK    App_ProtectFunction()
// 在这里添加需要间隔1000tick执行的任务，如果没有任务，注释掉define可以节省资源
//#define _POLSYS_TASK_GROUP_1000TICK
#else

// 启用空闲回调函数
// 启用后，当所有就绪的任务都处理完毕后 Polsys_EventIdle 会被调用，尽量让此函数阻塞等待中断，或者等待其他线程的同步信号。若不阻塞，若系统持续空闲，该函数会被反复调用。
// 提示：未使用RTOS时，Polsys_EventIdle定义成让CPU停止并等待中断唤醒的代码，可以降低运行时的功耗，但要注意电流快速变化引起的电压变化对电路的影响。
// 提示：使用RTOS时，将会始终启用，建议让Polsys_EventIdle阻塞线程，并在Tick中断或者Polsys_SetTaskReady被其他线程调用后唤醒本线程（执行Polsys_Loop的线程）。
// 注意：耗时的代码将会影响其它任务的响应实时性。
// #define _POLSYS_USE_IDLE_CB

// 最大任务数，<=255，所有任务的TCB的地址保存在一个数组里面，此为这个数组的长度。
#define POLSYS_MAX_TASKS 10

/*
启用优先级【目前仅实现了实时任务(TASK_PRIO_REAL_TIME)，其它优先级无效】
    定义后在初始化或者创建任务时可以设置一个优先级（周期 | 优先级），高优先级的任务先运行，每
次一个任务执行完毕会重新查找是否有更高优先级任务就绪，直到所有高优先级任务执行完毕才会执行低优
先级任务。
    注释掉表示不启用，优先级是无效的（Interval 参数的高3位依然无效）。
*/ 
// #define POLSYS_USE_PRIO


// 运行环境类型配置，此宏不是更改环境，而是告诉Polsys当前的环境，便于降低移植难度和决定Delay_ms的定义。
// 0: 未使用RTOS，main函数可自定义。
// 1: MCU驱动初始化后不返回，有些MCU的SDK内置了RTOS并深度捆绑，调用SDK初始化函数后RTOS就跑起来了。
// 2: MCU驱动定义了main函数，有些MCU的SDK不开放main函数。
// 7: 使用了RT-Thread（可完全自主操作）
// 8: 使用了FreeRTOS（可完全自主操作）
#define POLSYS_ENV_TYPE       0

// 定义表示任务入口函数可以带参数(void *)
#define POLSYS_USE_PARAM

#endif

// 组件设置，注释掉表示不使用(仅不包含头文件，也可以自行包含头文件使用)

#define POLSYS_USE_POLSYS_LIB
// #define POLSYS_USE_BMLITE
#define POLSYS_USE_BUTTON_CTRL_STATIC
// #define POLSYS_USE_CLED_CTRL_STATIC
// #define POLSYS_USE_SLED_CTRL_STATIC
#define POLSYS_USE_RHC
#define POLSYS_USE_SOFT_PWM
// #define POLSYS_USE_SOFT_UART
// #define POLSYS_USE_SOFT_FIFO
// #define POLSYS_USE_SOFT_CAP_SENSOR
// #define POLSYS_USE_TOUCH_KEY
// #define POLSYS_USE_SOFT_CAPTURE
// #define POLSYS_USE_SOFT_I2C
#define POLSYS_USE_SWSD_STATIC
// #define POLSYS_USE_UMI_STATIC
// #define POLSYS_USE_UID_LOCK

// 需要的API设置

#ifdef _POLSYS_DEBUG
// 获取Tick定时器周期值，用于计算CPU使用率，无法获取时可以返回1
#define _Polsys_GetTickTimerCycleValue()     Board_GetTickCycleValue()
//#define _Polsys_GetTickTimerCycleValue()     SYSTICK_VALUE
// 获取Tick定时器当前值（已经跑了多少），用于计算CPU使用率，无法获取时可以返回1.值可能大于655时需要确保返回的是int否则u16即可。
#define _Polsys_GetTickTimerNowValue()       Board_GetTickNowValue()
//#define _Polsys_GetTickTimerNowValue()       (SYSTICK_VALUE - SysTick->VAL)
#endif

#endif
